#ifndef XEMMAI__MACRO_H
#define XEMMAI__MACRO_H

#define XEMMAI__MACRO__CONCATENATE_(x, y) x##y
#define XEMMAI__MACRO__CONCATENATE(x, y) XEMMAI__MACRO__CONCATENATE_(x, y)

#define XEMMAI__MACRO__L_(n) L##n
#define XEMMAI__MACRO__L(n) XEMMAI__MACRO__L_(n)

#define XEMMAI__MACRO__LQ__(n) L##n
#define XEMMAI__MACRO__LQ_(n) XEMMAI__MACRO__LQ__(#n)
#define XEMMAI__MACRO__LQ(n) XEMMAI__MACRO__LQ_(n)

#define XEMMAI__MACRO__SUBTRACT_0_0 0
#define XEMMAI__MACRO__SUBTRACT_1_0 1
#define XEMMAI__MACRO__SUBTRACT_1_1 0
#define XEMMAI__MACRO__SUBTRACT_2_0 2
#define XEMMAI__MACRO__SUBTRACT_2_1 1
#define XEMMAI__MACRO__SUBTRACT_2_2 0
#define XEMMAI__MACRO__SUBTRACT_3_0 3
#define XEMMAI__MACRO__SUBTRACT_3_1 2
#define XEMMAI__MACRO__SUBTRACT_3_2 1
#define XEMMAI__MACRO__SUBTRACT_3_3 0
#define XEMMAI__MACRO__SUBTRACT_4_0 4
#define XEMMAI__MACRO__SUBTRACT_4_1 3
#define XEMMAI__MACRO__SUBTRACT_4_2 2
#define XEMMAI__MACRO__SUBTRACT_4_3 1
#define XEMMAI__MACRO__SUBTRACT_4_4 0
#define XEMMAI__MACRO__SUBTRACT_5_0 5
#define XEMMAI__MACRO__SUBTRACT_5_1 4
#define XEMMAI__MACRO__SUBTRACT_5_2 3
#define XEMMAI__MACRO__SUBTRACT_5_3 2
#define XEMMAI__MACRO__SUBTRACT_5_4 1
#define XEMMAI__MACRO__SUBTRACT_5_5 0
#define XEMMAI__MACRO__SUBTRACT_6_0 6
#define XEMMAI__MACRO__SUBTRACT_6_1 5
#define XEMMAI__MACRO__SUBTRACT_6_2 4
#define XEMMAI__MACRO__SUBTRACT_6_3 3
#define XEMMAI__MACRO__SUBTRACT_6_4 2
#define XEMMAI__MACRO__SUBTRACT_6_5 1
#define XEMMAI__MACRO__SUBTRACT_6_6 0
#define XEMMAI__MACRO__SUBTRACT_7_0 7
#define XEMMAI__MACRO__SUBTRACT_7_1 6
#define XEMMAI__MACRO__SUBTRACT_7_2 5
#define XEMMAI__MACRO__SUBTRACT_7_3 4
#define XEMMAI__MACRO__SUBTRACT_7_4 3
#define XEMMAI__MACRO__SUBTRACT_7_5 2
#define XEMMAI__MACRO__SUBTRACT_7_6 1
#define XEMMAI__MACRO__SUBTRACT_7_7 0
#define XEMMAI__MACRO__SUBTRACT_8_0 8
#define XEMMAI__MACRO__SUBTRACT_8_1 7
#define XEMMAI__MACRO__SUBTRACT_8_2 6
#define XEMMAI__MACRO__SUBTRACT_8_3 5
#define XEMMAI__MACRO__SUBTRACT_8_4 4
#define XEMMAI__MACRO__SUBTRACT_8_5 3
#define XEMMAI__MACRO__SUBTRACT_8_6 2
#define XEMMAI__MACRO__SUBTRACT_8_7 1
#define XEMMAI__MACRO__SUBTRACT_8_8 0
#define XEMMAI__MACRO__SUBTRACT_9_0 9
#define XEMMAI__MACRO__SUBTRACT_9_1 8
#define XEMMAI__MACRO__SUBTRACT_9_2 7
#define XEMMAI__MACRO__SUBTRACT_9_3 6
#define XEMMAI__MACRO__SUBTRACT_9_4 5
#define XEMMAI__MACRO__SUBTRACT_9_5 4
#define XEMMAI__MACRO__SUBTRACT_9_6 3
#define XEMMAI__MACRO__SUBTRACT_9_7 2
#define XEMMAI__MACRO__SUBTRACT_9_8 1
#define XEMMAI__MACRO__SUBTRACT_9_9 0
#define XEMMAI__MACRO__SUBTRACT_10_0 10
#define XEMMAI__MACRO__SUBTRACT_10_1 9
#define XEMMAI__MACRO__SUBTRACT_10_2 8
#define XEMMAI__MACRO__SUBTRACT_10_3 7
#define XEMMAI__MACRO__SUBTRACT_10_4 6
#define XEMMAI__MACRO__SUBTRACT_10_5 5
#define XEMMAI__MACRO__SUBTRACT_10_6 4
#define XEMMAI__MACRO__SUBTRACT_10_7 3
#define XEMMAI__MACRO__SUBTRACT_10_8 2
#define XEMMAI__MACRO__SUBTRACT_10_9 1
#define XEMMAI__MACRO__SUBTRACT_10_10 0
#define XEMMAI__MACRO__SUBTRACT_11_0 11
#define XEMMAI__MACRO__SUBTRACT_11_1 10
#define XEMMAI__MACRO__SUBTRACT_11_2 9
#define XEMMAI__MACRO__SUBTRACT_11_3 8
#define XEMMAI__MACRO__SUBTRACT_11_4 7
#define XEMMAI__MACRO__SUBTRACT_11_5 6
#define XEMMAI__MACRO__SUBTRACT_11_6 5
#define XEMMAI__MACRO__SUBTRACT_11_7 4
#define XEMMAI__MACRO__SUBTRACT_11_8 3
#define XEMMAI__MACRO__SUBTRACT_11_9 2
#define XEMMAI__MACRO__SUBTRACT_11_10 1
#define XEMMAI__MACRO__SUBTRACT_11_11 0
#define XEMMAI__MACRO__SUBTRACT_12_0 12
#define XEMMAI__MACRO__SUBTRACT_12_1 11
#define XEMMAI__MACRO__SUBTRACT_12_2 10
#define XEMMAI__MACRO__SUBTRACT_12_3 9
#define XEMMAI__MACRO__SUBTRACT_12_4 8
#define XEMMAI__MACRO__SUBTRACT_12_5 7
#define XEMMAI__MACRO__SUBTRACT_12_6 6
#define XEMMAI__MACRO__SUBTRACT_12_7 5
#define XEMMAI__MACRO__SUBTRACT_12_8 4
#define XEMMAI__MACRO__SUBTRACT_12_9 3
#define XEMMAI__MACRO__SUBTRACT_12_10 2
#define XEMMAI__MACRO__SUBTRACT_12_11 1
#define XEMMAI__MACRO__SUBTRACT_12_12 0
#define XEMMAI__MACRO__SUBTRACT_13_0 13
#define XEMMAI__MACRO__SUBTRACT_13_1 12
#define XEMMAI__MACRO__SUBTRACT_13_2 11
#define XEMMAI__MACRO__SUBTRACT_13_3 10
#define XEMMAI__MACRO__SUBTRACT_13_4 9
#define XEMMAI__MACRO__SUBTRACT_13_5 8
#define XEMMAI__MACRO__SUBTRACT_13_6 7
#define XEMMAI__MACRO__SUBTRACT_13_7 6
#define XEMMAI__MACRO__SUBTRACT_13_8 5
#define XEMMAI__MACRO__SUBTRACT_13_9 4
#define XEMMAI__MACRO__SUBTRACT_13_10 3
#define XEMMAI__MACRO__SUBTRACT_13_11 2
#define XEMMAI__MACRO__SUBTRACT_13_12 1
#define XEMMAI__MACRO__SUBTRACT_13_13 0
#define XEMMAI__MACRO__SUBTRACT_14_0 14
#define XEMMAI__MACRO__SUBTRACT_14_1 13
#define XEMMAI__MACRO__SUBTRACT_14_2 12
#define XEMMAI__MACRO__SUBTRACT_14_3 11
#define XEMMAI__MACRO__SUBTRACT_14_4 10
#define XEMMAI__MACRO__SUBTRACT_14_5 9
#define XEMMAI__MACRO__SUBTRACT_14_6 8
#define XEMMAI__MACRO__SUBTRACT_14_7 7
#define XEMMAI__MACRO__SUBTRACT_14_8 6
#define XEMMAI__MACRO__SUBTRACT_14_9 5
#define XEMMAI__MACRO__SUBTRACT_14_10 4
#define XEMMAI__MACRO__SUBTRACT_14_11 3
#define XEMMAI__MACRO__SUBTRACT_14_12 2
#define XEMMAI__MACRO__SUBTRACT_14_13 1
#define XEMMAI__MACRO__SUBTRACT_14_14 0
#define XEMMAI__MACRO__SUBTRACT_15_0 15
#define XEMMAI__MACRO__SUBTRACT_15_1 14
#define XEMMAI__MACRO__SUBTRACT_15_2 13
#define XEMMAI__MACRO__SUBTRACT_15_3 12
#define XEMMAI__MACRO__SUBTRACT_15_4 11
#define XEMMAI__MACRO__SUBTRACT_15_5 10
#define XEMMAI__MACRO__SUBTRACT_15_6 9
#define XEMMAI__MACRO__SUBTRACT_15_7 8
#define XEMMAI__MACRO__SUBTRACT_15_8 7
#define XEMMAI__MACRO__SUBTRACT_15_9 6
#define XEMMAI__MACRO__SUBTRACT_15_10 5
#define XEMMAI__MACRO__SUBTRACT_15_11 4
#define XEMMAI__MACRO__SUBTRACT_15_12 3
#define XEMMAI__MACRO__SUBTRACT_15_13 2
#define XEMMAI__MACRO__SUBTRACT_15_14 1
#define XEMMAI__MACRO__SUBTRACT_15_15 0
#define XEMMAI__MACRO__SUBTRACT_16_0 16
#define XEMMAI__MACRO__SUBTRACT_16_1 15
#define XEMMAI__MACRO__SUBTRACT_16_2 14
#define XEMMAI__MACRO__SUBTRACT_16_3 13
#define XEMMAI__MACRO__SUBTRACT_16_4 12
#define XEMMAI__MACRO__SUBTRACT_16_5 11
#define XEMMAI__MACRO__SUBTRACT_16_6 10
#define XEMMAI__MACRO__SUBTRACT_16_7 9
#define XEMMAI__MACRO__SUBTRACT_16_8 8
#define XEMMAI__MACRO__SUBTRACT_16_9 7
#define XEMMAI__MACRO__SUBTRACT_16_10 6
#define XEMMAI__MACRO__SUBTRACT_16_11 5
#define XEMMAI__MACRO__SUBTRACT_16_12 4
#define XEMMAI__MACRO__SUBTRACT_16_13 3
#define XEMMAI__MACRO__SUBTRACT_16_14 2
#define XEMMAI__MACRO__SUBTRACT_16_15 1
#define XEMMAI__MACRO__SUBTRACT_16_16 0
#define XEMMAI__MACRO__SUBTRACT(x, y) XEMMAI__MACRO__CONCATENATE(XEMMAI__MACRO__CONCATENATE(XEMMAI__MACRO__SUBTRACT_, x), XEMMAI__MACRO__CONCATENATE(_, y))

#define XEMMAI__MACRO__REPEAT_0(macro)
#define XEMMAI__MACRO__REPEAT_1(macro) XEMMAI__MACRO__REPEAT_0(macro) macro(0)
#define XEMMAI__MACRO__REPEAT_2(macro) XEMMAI__MACRO__REPEAT_1(macro) macro(1)
#define XEMMAI__MACRO__REPEAT_3(macro) XEMMAI__MACRO__REPEAT_2(macro) macro(2)
#define XEMMAI__MACRO__REPEAT_4(macro) XEMMAI__MACRO__REPEAT_3(macro) macro(3)
#define XEMMAI__MACRO__REPEAT_5(macro) XEMMAI__MACRO__REPEAT_4(macro) macro(4)
#define XEMMAI__MACRO__REPEAT_6(macro) XEMMAI__MACRO__REPEAT_5(macro) macro(5)
#define XEMMAI__MACRO__REPEAT_7(macro) XEMMAI__MACRO__REPEAT_6(macro) macro(6)
#define XEMMAI__MACRO__REPEAT_8(macro) XEMMAI__MACRO__REPEAT_7(macro) macro(7)
#define XEMMAI__MACRO__REPEAT_9(macro) XEMMAI__MACRO__REPEAT_8(macro) macro(8)
#define XEMMAI__MACRO__REPEAT_10(macro) XEMMAI__MACRO__REPEAT_9(macro) macro(9)
#define XEMMAI__MACRO__REPEAT_11(macro) XEMMAI__MACRO__REPEAT_10(macro) macro(10)
#define XEMMAI__MACRO__REPEAT_12(macro) XEMMAI__MACRO__REPEAT_11(macro) macro(11)
#define XEMMAI__MACRO__REPEAT_13(macro) XEMMAI__MACRO__REPEAT_12(macro) macro(12)
#define XEMMAI__MACRO__REPEAT_14(macro) XEMMAI__MACRO__REPEAT_13(macro) macro(13)
#define XEMMAI__MACRO__REPEAT_15(macro) XEMMAI__MACRO__REPEAT_14(macro) macro(14)
#define XEMMAI__MACRO__REPEAT_16(macro) XEMMAI__MACRO__REPEAT_15(macro) macro(15)
#define XEMMAI__MACRO__REPEAT(macro, n) XEMMAI__MACRO__CONCATENATE(XEMMAI__MACRO__REPEAT_, n)(macro)

#define XEMMAI__MACRO__JOIN_0(macro)
#define XEMMAI__MACRO__JOIN_1(macro) macro(0)
#define XEMMAI__MACRO__JOIN_2(macro) XEMMAI__MACRO__JOIN_1(macro), macro(1)
#define XEMMAI__MACRO__JOIN_3(macro) XEMMAI__MACRO__JOIN_2(macro), macro(2)
#define XEMMAI__MACRO__JOIN_4(macro) XEMMAI__MACRO__JOIN_3(macro), macro(3)
#define XEMMAI__MACRO__JOIN_5(macro) XEMMAI__MACRO__JOIN_4(macro), macro(4)
#define XEMMAI__MACRO__JOIN_6(macro) XEMMAI__MACRO__JOIN_5(macro), macro(5)
#define XEMMAI__MACRO__JOIN_7(macro) XEMMAI__MACRO__JOIN_6(macro), macro(6)
#define XEMMAI__MACRO__JOIN_8(macro) XEMMAI__MACRO__JOIN_7(macro), macro(7)
#define XEMMAI__MACRO__JOIN_9(macro) XEMMAI__MACRO__JOIN_8(macro), macro(8)
#define XEMMAI__MACRO__JOIN_10(macro) XEMMAI__MACRO__JOIN_9(macro), macro(9)
#define XEMMAI__MACRO__JOIN_11(macro) XEMMAI__MACRO__JOIN_10(macro), macro(10)
#define XEMMAI__MACRO__JOIN_12(macro) XEMMAI__MACRO__JOIN_11(macro), macro(11)
#define XEMMAI__MACRO__JOIN_13(macro) XEMMAI__MACRO__JOIN_12(macro), macro(12)
#define XEMMAI__MACRO__JOIN_14(macro) XEMMAI__MACRO__JOIN_13(macro), macro(13)
#define XEMMAI__MACRO__JOIN_15(macro) XEMMAI__MACRO__JOIN_14(macro), macro(14)
#define XEMMAI__MACRO__JOIN_16(macro) XEMMAI__MACRO__JOIN_15(macro), macro(15)
#define XEMMAI__MACRO__JOIN(macro, n) XEMMAI__MACRO__CONCATENATE(XEMMAI__MACRO__JOIN_, n)(macro)

#define XEMMAI__MACRO__COMMA_IF_0
#define XEMMAI__MACRO__COMMA_IF_1 , 
#define XEMMAI__MACRO__COMMA_IF_2 , 
#define XEMMAI__MACRO__COMMA_IF_3 , 
#define XEMMAI__MACRO__COMMA_IF_4 , 
#define XEMMAI__MACRO__COMMA_IF_5 , 
#define XEMMAI__MACRO__COMMA_IF_6 , 
#define XEMMAI__MACRO__COMMA_IF_7 , 
#define XEMMAI__MACRO__COMMA_IF_8 , 
#define XEMMAI__MACRO__COMMA_IF_9 , 
#define XEMMAI__MACRO__COMMA_IF_10 , 
#define XEMMAI__MACRO__COMMA_IF_11 , 
#define XEMMAI__MACRO__COMMA_IF_12 , 
#define XEMMAI__MACRO__COMMA_IF_13 , 
#define XEMMAI__MACRO__COMMA_IF_14 , 
#define XEMMAI__MACRO__COMMA_IF_15 , 
#define XEMMAI__MACRO__COMMA_IF_16 , 
#define XEMMAI__MACRO__COMMA_IF(n) XEMMAI__MACRO__CONCATENATE(XEMMAI__MACRO__COMMA_IF_, n)

#endif

#ifdef XEMMAI__MACRO__INCLUDE

#if XEMMAI__MACRO__N == 0
#elif XEMMAI__MACRO__N == 1
#undef XEMMAI__MACRO__N
#define XEMMAI__MACRO__N 0
#include XEMMAI__MACRO__ITERATE
#elif XEMMAI__MACRO__N == 2
#undef XEMMAI__MACRO__N
#define XEMMAI__MACRO__N 1
#include "macro.h"
#define XEMMAI__MACRO__N 1
#include XEMMAI__MACRO__ITERATE
#elif XEMMAI__MACRO__N == 3
#undef XEMMAI__MACRO__N
#define XEMMAI__MACRO__N 2
#include "macro.h"
#define XEMMAI__MACRO__N 2
#include XEMMAI__MACRO__ITERATE
#elif XEMMAI__MACRO__N == 4
#undef XEMMAI__MACRO__N
#define XEMMAI__MACRO__N 3
#include "macro.h"
#define XEMMAI__MACRO__N 3
#include XEMMAI__MACRO__ITERATE
#elif XEMMAI__MACRO__N == 5
#undef XEMMAI__MACRO__N
#define XEMMAI__MACRO__N 4
#include "macro.h"
#define XEMMAI__MACRO__N 4
#include XEMMAI__MACRO__ITERATE
#elif XEMMAI__MACRO__N == 6
#undef XEMMAI__MACRO__N
#define XEMMAI__MACRO__N 5
#include "macro.h"
#define XEMMAI__MACRO__N 5
#include XEMMAI__MACRO__ITERATE
#elif XEMMAI__MACRO__N == 7
#undef XEMMAI__MACRO__N
#define XEMMAI__MACRO__N 6
#include "macro.h"
#define XEMMAI__MACRO__N 6
#include XEMMAI__MACRO__ITERATE
#elif XEMMAI__MACRO__N == 8
#undef XEMMAI__MACRO__N
#define XEMMAI__MACRO__N 7
#include "macro.h"
#define XEMMAI__MACRO__N 7
#include XEMMAI__MACRO__ITERATE
#elif XEMMAI__MACRO__N == 9
#undef XEMMAI__MACRO__N
#define XEMMAI__MACRO__N 8
#include "macro.h"
#define XEMMAI__MACRO__N 8
#include XEMMAI__MACRO__ITERATE
#elif XEMMAI__MACRO__N == 10
#undef XEMMAI__MACRO__N
#define XEMMAI__MACRO__N 9
#include "macro.h"
#define XEMMAI__MACRO__N 9
#include XEMMAI__MACRO__ITERATE
#elif XEMMAI__MACRO__N == 11
#undef XEMMAI__MACRO__N
#define XEMMAI__MACRO__N 10
#include "macro.h"
#define XEMMAI__MACRO__N 10
#include XEMMAI__MACRO__ITERATE
#elif XEMMAI__MACRO__N == 12
#undef XEMMAI__MACRO__N
#define XEMMAI__MACRO__N 11
#include "macro.h"
#define XEMMAI__MACRO__N 11
#include XEMMAI__MACRO__ITERATE
#elif XEMMAI__MACRO__N == 13
#undef XEMMAI__MACRO__N
#define XEMMAI__MACRO__N 12
#include "macro.h"
#define XEMMAI__MACRO__N 12
#include XEMMAI__MACRO__ITERATE
#elif XEMMAI__MACRO__N == 14
#undef XEMMAI__MACRO__N
#define XEMMAI__MACRO__N 13
#include "macro.h"
#define XEMMAI__MACRO__N 13
#include XEMMAI__MACRO__ITERATE
#elif XEMMAI__MACRO__N == 15
#undef XEMMAI__MACRO__N
#define XEMMAI__MACRO__N 14
#include "macro.h"
#define XEMMAI__MACRO__N 14
#include XEMMAI__MACRO__ITERATE
#elif XEMMAI__MACRO__N == 16
#undef XEMMAI__MACRO__N
#define XEMMAI__MACRO__N 15
#include "macro.h"
#define XEMMAI__MACRO__N 15
#include XEMMAI__MACRO__ITERATE
#endif
#undef XEMMAI__MACRO__N

#elif defined(XEMMAI__MACRO__ITERATE)

#define XEMMAI__MACRO__INCLUDE
#include "macro.h"
#undef XEMMAI__MACRO__INCLUDE
#undef XEMMAI__MACRO__ITERATE

#endif
